package com.weed.helper;

import com.weed.core.WeedException;
import java.io.*;
import java.util.*;

import org.jdom.*;
import org.jdom.input.*;
import com.weed.core.*;


/**
 * 函数说明:
 *     用于读取配置文件。
 *
 * 版本    修订人        说明
 * 0.1    Jason Zhuo    新增日志工厂
 */


public class Config
    implements Runnable {
  /**
   * 日志监控线程。
   */
  Thread logThread = null;
  /**
   * XML的文件名。
   */
  String filename = "Weed.xml";
  /**
   * 存放读入的XML文件。
   */
  List result;
  /**
   * 用于判断是否更新，更新时读取XML文件。
   */
  private File file = new File(filename); //出于性能上考滤，file只有在filename值被更改时才更新。
  /**
   * 最后一次的修改时间。
   */
  long lastModifiedTime = 0;

  public Config() {
  }
  /**
   * 配置文件监控线程。
   */
  public void start(){
    if(logThread == null)
      logThread = new Thread(this);
    logThread.start();
  }
  /**
   * 根据接口描述配置，获得实现的类。
   * @param interfaceClass String
   * @return String
   */
  public String getImplementClass(String interfaceClass){
     int point = result.indexOf(new XMLItem(interfaceClass));//位置
     XMLItem item = (XMLItem)result.get(point);
     return item.getImplementClass();
  }
  /**
   * 读取配置文件。
   * @throws WeedException
   */
  public void loadXML() throws WeedException {
    ArrayList retlist = new ArrayList();
    if (file == null || file.isDirectory() || !file.canRead()) {
      throw new WeedException("xml file[" + filename + "] not found!");
    }
    this.setLastModifiedTime(file.lastModified());
    try {
      SAXBuilder builder = new SAXBuilder();
      InputStream is = new FileInputStream(filename);
      Document doc = builder.build(is);
      Element root = doc.getRootElement();
      Element impl = root.getChild("impl");
      List interfaces = impl.getChildren("interface");
      int count = interfaces.size();
      for (int point = 0; point < count; point++) {
        Element _interface = (Element) interfaces.get(point);
        List attribList = _interface.getAttributes();
        XMLItem item = new XMLItem();
        if (attribList.size() > 0) {
          item.setInterfaceClass(_interface.getAttributeValue("interface-class"));
          item.setImplementClass(_interface.getAttributeValue("implement-class"));
        }
        List childrenList = _interface.getChildren(); //所有的子节点
        int childrenCount = childrenList.size(); //子节点总数
        for (int inte_point = 0; inte_point < childrenCount; inte_point++) {
          Element target = (Element) childrenList.get(inte_point); //name、implementClass或interfaceClass节点。
          if (target.getName().equalsIgnoreCase("implement-class")) {
            item.setImplementClass(target.getText());
          }
          else if (target.getName().equalsIgnoreCase("interface-class")) {
            item.setInterfaceClass(target.getText());
          }
        }
        retlist.add(item);
      }
    }
    catch (IOException ex) {
      throw new WeedException(ex);
    }
    catch (JDOMException ex) {
      throw new WeedException(ex);
    }

    result = retlist;
  }
  /**
   * 获得配置文件的名称及位置。
   * @return String
   */
  public String getFilename() {
    return filename;
  }
  /**
   * 获得最后的修改时间。
   * @return long
   */
  public long getLastModifiedTime() {
    return lastModifiedTime;
  }
  /**
   * 获得结果列表。
   * @return List
   */
  public List getResult() {
    return result;
  }
  /**
   * 设置XML文件名称。
   * @param filename String
   */
  public void setFilename(String filename) {
    this.filename = filename;
    file = new File(filename);
  }
  /**
   * 设置最后的修改时间。
   * @param lastModifiedTime long
   */
  public void setLastModifiedTime(long lastModifiedTime) {
    this.lastModifiedTime = lastModifiedTime;
  }

  /**
   * 实时读取线程。
   */
  public void run() {
    if (file != null && file.isFile()) {
      if (lastModifiedTime != file.lastModified()) { //修改时间被更改。
        try {
          loadXML();
          Thread.currentThread().sleep(1000);
        }catch (InterruptedException ex) {
           //log.error("", ex);
        }
        catch (WeedException ex) {
         // log.error(filename + " file invalid!", ex);
        }
      }
    }
  }
  /**
   * 测试配置文件。
   * @param args String[]
   */
  public static void main(String[] args) {
    Config config = new Config();
    try {
      config.loadXML();
      List list = config.getResult();
      for (int now = 0; now < list.size(); now++) {
        System.out.println(list.get(now));
      }
      System.err.println("index of " + list.indexOf(new XMLItem("com.weed.common.Log")));
//      Thread thread = new Thread(config);
//      thread.start();
    }
    catch (WeedException ex) {
    }

  }
}
